Apresentação dos dados

Nesse laboratório utilizamos dados referentes aos alunos que já concluíram o curso de Ciência da Computação - UFCG. Nele se encontram, de cada aluno, todas as médias finais obtidas em cada disciplina (5-10), assim como o coeficiente de rendimento acadêmico (cra, ~4-10).

Queremos realizar análises de regressão utilizando as disciplinas dos dois primeiros períodos e cra na tentativa de responder a seguinte pergunta:

O desempenho dos alunos nos dois primeiros períodos consegue explicar, em algum grau, seus desempenhos no curso como um todo?

Para isso, construiremos um modelo de regressão com disciplinas do primeiro e segundo período. Ao longo desse documento iremos responder perguntas a respeito do modelo e realizar comparações. Logo abaixo um breve resumo de como se distribuem as variáveis quando relacionadas e seus respectivos coeficientes de correlação.

Legenda

graduados = read.csv("graduados_disciplinas.csv")

graduados = graduados[, c("Cálculo.Diferencial.e.Integral.I",  "Álgebra.Vetorial.e.Geometria.Analítica", "Leitura.e.Produção.de.Textos", "Programação.I", "Laboratório.de.Programação.I", "Introdução.à.Computação", "Cálculo.Diferencial.e.Integral.II", "Matemática.Discreta", "Programação.II", "Laboratório.de.Programação.II", "Teoria.dos.Grafos", "Fundamentos.de.Física.Clássica", "cra")]

colnames(graduados) = c("Cálculo.1", "Vetorial", "LPT", "P1", "LP1", "IC", "Cálculo.2", "Discreta", "P2", "LP2", "Grafos", "Física.3", "cra")

ggpairs(na.omit(graduados), lower = list(continuous = "smooth"), upper = list(continuous = wrap("cor", size = 10)))

# ggcorr(graduados1[, 2:8], geom = "circle", nbreaks = 5)
# ggcorr(graduados1[, 2:8], nbreaks = 5,  label = TRUE, label_size = 3, label_round = 2, label_alpha = TRUE)

Um modelo de regressão múltipla com todas as variáveis é plausível para explicar a variação em y? Em que grau?

Para responder esta pergunta criamos um modelo de regressão linear múltipla que englobe todas disciplinas como variáveis independentes e o cra como variável dependente. Após a criação do modelo, obtemos um resumo do mesmo com suas principais características relacionadas a efetividade.

rl = lm(cra ~ ., data = graduados)

summary(rl)
## 
## Call:
## lm(formula = cra ~ ., data = graduados)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -1.8273 -0.2988  0.1069  0.2796  1.0032 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  1.33894    0.59783   2.240  0.02758 *  
## Cálculo.1    0.02121    0.04907   0.432  0.66661    
## Vetorial     0.04443    0.04762   0.933  0.35327    
## LPT          0.09172    0.05167   1.775  0.07925 .  
## P1          -0.02593    0.07684  -0.337  0.73660    
## LP1         -0.02472    0.07450  -0.332  0.74082    
## IC           0.10196    0.08639   1.180  0.24098    
## Cálculo.2   -0.00100    0.05302  -0.019  0.98499    
## Discreta     0.23935    0.05863   4.083 9.63e-05 ***
## P2           0.29214    0.09553   3.058  0.00293 ** 
## LP2         -0.02848    0.06666  -0.427  0.67024    
## Grafos       0.09620    0.06302   1.526  0.13040    
## Física.3    -0.01024    0.06120  -0.167  0.86745    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.5046 on 90 degrees of freedom
##   (309 observations deleted due to missingness)
## Multiple R-squared:  0.6889, Adjusted R-squared:  0.6474 
## F-statistic: 16.61 on 12 and 90 DF,  p-value: < 2.2e-16

Utilizamos o Residual standart error (RSE) para interpretar parte do nosso modelo. RSE é o desvio padrão dos resíduos que descreve a variabilidade referente ao modelo de regressão utilizado. Queremos que o valor RSE seja o menor possível. O RSE do modelo tem valor igual a 0.5046.

Uma segunda variável que utilizamos é o R-quadrado que apresenta valor referente ao coeficiente de determinação, ela varia entre 0-1 e indica quanto o modelo consegue explicar o valor observado, no nosso caso, o cra. Quanto maior o R-quadrado, melhor, significando que o modelo é mais explicativo. Existe um tendência de que quanto mais variáveis o modelo possuir, maior o seu poder explicativo, incentivando a inserção de muitas variáveis e para combater isso existe o R-quadrado ajustado. R-quadrado ajustado funciona da mesma maneira que o R-quadrado, com a diferença de que ele sofre penalização se há inclusão de variáveis com muito pouco poder explicativo. Para todos os modelos deste documento estaremos utilizando valores relacionados ao R-quadrado ajustado para medir o poder de explicação dos mesmos.

Interpretandos os dados acima temos que o R-quadrado ajustado tem valor igual a 0.6474, isso signigica que 64.74% do cra consegue ser explicado pelas variáveis independentes presentes no modelo. Então, sim, o modelo explica parte da variável dependente em mais de 50%.

Todas as variáveis são úteis para o modelo de regressão?

Apesar de o modelo explicar a variável dependente em quase 67%, nem todas as variáveis independentes que fazem parte dele apresentam influência considerável. Neste documento, utilizaremos dois principais valores para avaliar a utilidade e significância de uma variável independente presente em um modelo: seu coeficiente (relacionado a magnitude) e p-valor.

O coeficiente de uma variável é referênte ao poder de influência que ela tem na variável dependente. O p-valor é referente a probabilidade de exisência por chance, queremos que este valor seja o menor possível para que a variável seja considerada importante para o modelo.

Disciplinas como Física 3, Cálculo 2, Cálculo 1 etc, apresentam baixo coeficiente e p-valor elevado. Essas variáveis influenciam minimamente e não são consideradas úteis para o modelo. Portanto, nem todas as variáveis são úteis para o modelo de regressão apresentado.

Se a resposta para a pergunta anterior foi não, construa um novo modelo sem essas variáveis e o compare ao modelo com todas as variáveis (e.g. em termos de R2 e RSE).

Selecionaremos variáveis baseadas em seus coeficientes e p-valor. Além disso, quando duas variáveis possuírem um alto coeficiente de correlação**, removeremos uma delas, já que váriáveis muito correlacionadas inserem redundância no modelo e podem proporcionar geração de valores incosistentes. Utilizaremos o summary do modelo e o correlograma abaixo para extrair e analisar esses valores.

**Um valor será considerado alto quando for >= 0.65. Valor escolhido com base na comparação relativa de coeficientes obtidos.

M = cor(na.omit(graduados[,1:12]))

corrplot(M, type = "lower", title = "Correlação de disciplinas",  order="hclust", col=brewer.pal(n=7, name="PuOr"), addCoef.col = "black", tl.col="black", tl.srt=45, mar=c(0,0,1,0) )

# 
# ggplot(graduados1, aes(graduados1$IC, graduados1$cra)) +  
#   geom_point(alpha = 0.1, position = position_jitter(width = 0.3), color="purple4") + 
#   labs(title="Previsão do modelo", x= "Nota em IC", y="CRA") +  
#   geom_line(aes(y = predict(rl1, graduados1)), colour = "red")

Iniciaremos removendo variáveis com alto coeficiente de correlação:

  • O coeficiente de correlação de P1 e LP1 é igual a 0.77, decidimos manter P1 porque apresenta coeficiente (-0.02593) mais significativo e menor p-valor (0.73660).
  • O coeficiente de correlação de P2 e Grafos é igual a 0.65, decidimos manter P2 porque apresenta coeficiente (0.29214) mais significativo e menor p-valor (0.00293).
  • O coeficiente de correlação de LP2 e Discreta é igual a 0.65, decidimos manter Discreta porque apresenta coeficiente (0.23935) mais significativo e menor p-valor (9.63e-05).

Agora removemos as variáveis menos significativas considerando menores valores referentes ao coeficiente e maiors referentes ao p-valor:

  • Cálculo.1 - coeficiente: 0.02121 / p-valor: 0.66661
  • Cálculo.2 - coeficiente: -0.00100 / p-valor: 0.98499
  • Física.3 - coeficiente: -0.01024 / p-valor: 0.86745

Sendo assim, nosso modelo fica da seguinte maneira:

graduados = graduados[, c("LPT", "P1", "IC", "Vetorial", "Discreta", "P2", "cra")]
rl = lm(cra ~ ., data = graduados)

summary(rl)
## 
## Call:
## lm(formula = cra ~ ., data = graduados)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -2.26305 -0.24549  0.06888  0.34986  1.17262 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  1.07020    0.35305   3.031 0.002660 ** 
## LPT          0.09195    0.03479   2.643 0.008669 ** 
## P1           0.05407    0.03047   1.774 0.077052 .  
## IC           0.19125    0.04939   3.872 0.000134 ***
## Vetorial     0.14360    0.02936   4.891 1.69e-06 ***
## Discreta     0.16460    0.03037   5.420 1.27e-07 ***
## P2           0.17707    0.03380   5.239 3.16e-07 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.5342 on 284 degrees of freedom
##   (121 observations deleted due to missingness)
## Multiple R-squared:  0.6006, Adjusted R-squared:  0.5921 
## F-statistic: 71.17 on 6 and 284 DF,  p-value: < 2.2e-16

O modelo agora apresenta um R-quadrado ajustado mais elevado, com valor igual a 0.5921, ou seja, ele explica em 59.21% a variável dependente. Por outro lado, o RSE teve seu valor elevado para 0,5342. Apesar disso, devido ao fato de que removemos variáveis, a quantidade de linhas com valores nulos diminuiu, aumentanto o tamanho da amostra e, consequentemente, a quantidade de graus de liberdade.

Analise os plots de resíduos de cada variável e veja se algum (um ou mais) deles indica não aleatoriedade dos erros.

Que período consegue explicar melhor o desempenho final (primeiro ou segundo)?

graduados1 = graduados[,c("Vetorial", "LPT", "P1", "IC", "cra")]
graduados2 = graduados[, c("Discreta", "P2", "cra")]

graduados1 = na.omit(graduados1)
graduados2 = na.omit(graduados2)

rl1 = lm(cra ~ ., data = graduados1)
rl2 = lm(cra ~ ., data = graduados2)

summary(rl1)
## 
## Call:
## lm(formula = cra ~ ., data = graduados1)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -2.57648 -0.30289  0.08898  0.38674  1.22632 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  1.29320    0.37856   3.416 0.000724 ***
## Vetorial     0.15711    0.03145   4.996 1.00e-06 ***
## LPT          0.11576    0.03687   3.139 0.001864 ** 
## P1           0.14305    0.03010   4.752 3.15e-06 ***
## IC           0.35370    0.04865   7.270 3.23e-12 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.5841 on 296 degrees of freedom
## Multiple R-squared:  0.5154, Adjusted R-squared:  0.5089 
## F-statistic: 78.71 on 4 and 296 DF,  p-value: < 2.2e-16
summary(rl2)
## 
## Call:
## lm(formula = cra ~ ., data = graduados2)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -2.3370 -0.3236  0.1042  0.3816  1.4854 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  3.15763    0.26422  11.951  < 2e-16 ***
## Discreta     0.29418    0.02995   9.821  < 2e-16 ***
## P2           0.28134    0.03258   8.634 3.03e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.6216 on 314 degrees of freedom
## Multiple R-squared:  0.4637, Adjusted R-squared:  0.4603 
## F-statistic: 135.8 on 2 and 314 DF,  p-value: < 2.2e-16

Use o modelo para predizer o seu próprio desempenho e compare a predição com o seu CRA atual. Comente o resultado.